#创建代课老师清单
from src.book.excu.E3_7 import result

tehacers=['杜睿娟','丁晓红','王亚莉','兰彩霞','贺国庆']
#创建二位列表，第一个元素代表基础课程，第二个元素代表专业课程
courses={'基础课程':[['线性代数',3,18],['高等数学B',5,18]],'专业课程':['Python程序设计']}
#创建三维列表，分别代表年级(从2022级开始)，专业，班级
classes={'2025级':{'计算机科学与技术':['2025级计算机科学与技术本科1班','2025级计算机科学与技术本科2班'],
                   '工商管理':['2025级工商管理本科班'],
                   '网络空间安全':['2025级网络空间安全本科1班','2025级网络空间安全本科2班']}}
times=[[i for i in range(1,11)] for _ in range(1,6)]
#区域、教学楼、教室3个维度创建教室清单
rooms={'安宁校区':{'明法楼':['301']},
       '新区校区':{'躬行楼':['301']}}
#导入已安排好的代课任务
tasks={'2026-1':[['线性代数','2025级工商管理本科班','丁晓红']]}
#创建排课结果列表
results=[]
#定义学期
semester='2026-1'
#定义硬性排课规则
def is_valid_assignment(task,time,room,results):
    for result in results:
        #1、先检查某一时间点教室是否已被占用,也就是已再results中存在
        if(time==result[1] and room==result[2]):
            return False
        #2、检查某一时间点该班级是否有课
        if(time==result[1] and task[semester][1]==result[0][semester][1]):
            return False

    return True

#通过回溯法开始排课
def backtrack(tasks,times,rooms,index=0):
    #如果index等于任务长度，则说明所有教学任务都已分配完毕
    if(index==len(tasks)):
        return True
    #为当前任务排课
    task=tasks['2026-1'][index]
    #先排时间，再排教室
    for time in times:
        for room in rooms:
            #如果时间和教室合法，则为其分配时间和教室
            if is_valid_assignment(task,time,room):
                results.append([task,time,room])
            #为下一个任务进行分配
            if backtrack(tasks,times,rooms,index+1):
                return True

    return False


#开始正式排课
backtrack(tasks,times,rooms,0)
#打印课表
print(results)
